/**
 * 快乐数
 * 「快乐数」定义为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，然后重复这个过程直到这个数变为 1
 * 也可能是 无限循环 但始终变不到 1。如果 可以变为  1，那么这个数就是快乐数。
 */

impl Solution {
    pub fn is_happy(n: i32) -> bool {
        let mut vec: Vec<i32> = Vec::new();
        let mut sum = get_sum(n);
        while sum != 0 && sum != 1 {
            sum = get_sum(sum);
            //当sum回到最初时则表示无限循环开始,不可能是快乐数
            if vec.contains(&sum) {
                sum = 0;
            } else {
                vec.push(sum);
            }
        }
        sum == 1
    }
}

struct Solution {}

fn main() {
    println!("{}", Solution::is_happy(1000));
}

fn get_sum(num: i32) -> i32 {
    let mut sum = 0;
    let mut digits = split_integer(num);
    for n in digits.iter() {
        if *n == 0 {
            continue;
        }
        sum += n * n;
    }
    return sum;
}

fn split_integer(mut num: i32) -> Vec<i32> {
    let mut digits = Vec::new();
    while num > 0 {
        digits.push(num % 10); // 取出最低位的数字
        num /= 10; // 移除最低位的数字
    }
    digits.reverse(); // 逆序
    digits
}
